package com.ship.dispatch.service.fob.impl;
/**
 *@title SpFobTemplateServiceImpl
 *@description
 *@author yl
 *@create 2023/12/16 0016
 */

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.http.HttpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.ship.common.core.domain.R;
import com.ship.common.core.exception.BusException;
import com.ship.common.core.web.domain.BaseResultCode;
import com.ship.common.core.web.domain.JsonResult;
import com.ship.common.business.service.impl.BaseServiceImpl;
import com.ship.common.security.utils.SecurityUtils;
import com.ship.dispatch.bean.fob.SpFobTemplate;
import com.ship.dispatch.bean.fob.SpFobTemplateFlie;
import com.ship.dispatch.bean.fob.SpFobTemplateFlieVo;
import com.ship.dispatch.bo.fileTemplate.SpFobTemplateBO;
import com.ship.dispatch.bpm.utils.TemplateParamUtils;
import com.ship.dispatch.bpm.vo.dto.FieldOptions;
import com.ship.dispatch.bpm.vo.dto.FormTemplate;
import com.ship.dispatch.mapper.SpFobTemplateFlieMapper;
import com.ship.dispatch.mapper.fob.SpFobTemplateMapper;
import com.ship.dispatch.model.dto.fileTemplate.SpFobFileTemplateDto;
import com.ship.dispatch.model.dto.fileTemplate.SpFobTemplateDto;
import com.ship.dispatch.model.dto.fileTemplate.SpFobTemplateUpdateDto;
import com.ship.dispatch.service.ConShippingService;
import com.ship.dispatch.service.SpFobTemplateFlieServer;
import com.ship.dispatch.service.fob.SpFobTemplateService;
import com.ship.dispatch.vo.fileTemplate.NodeVO;
import com.ship.dispatch.vo.fileTemplate.SpFobFileTemplateListVO;
import com.ship.dispatch.vo.fileTemplate.SpFobTemplateListVO;
import com.ship.system.api.RemoteFileService;
import com.ship.system.api.domain.SysFile;
import liquibase.pro.packaged.D;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;


import java.util.List;
import java.io.FileOutputStream;
import java.util.ArrayList;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.springframework.web.multipart.MultipartFile;

import javax.net.ssl.HttpsURLConnection;
import java.net.HttpURLConnection;
import java.net.URL;

import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

@Service
public class SpFobTemplateServiceImpl extends BaseServiceImpl<SpFobTemplateMapper, SpFobTemplate> implements SpFobTemplateService {

    @Autowired(required = false)
    SpFobTemplateMapper spFobTemplateMapper;

    @Autowired(required = false)
    SpFobTemplateFlieServer spFobTemplateFlieServer;
    @Autowired(required = false)
    SpFobTemplateFlieMapper spFobTemplateFlieMapper;
    @Autowired
    private RemoteFileService remoteFileService;



    @Value("${file_server.host}")
    private String fileServerHost;

    @Override
    public List<FieldOptions> getTemplateInfoByServiceKey(String key,String type) {
        List<SpFobTemplate> templates = this.list(new LambdaQueryWrapper<SpFobTemplate>().eq(SpFobTemplate::getTemplateKey,key).eq(SpFobTemplate::getTemplateType,type).eq(SpFobTemplate::getTemplateStatus,1));
        List<FieldOptions> options = new ArrayList<>();
        for(SpFobTemplate template:templates){
            FieldOptions options1 = new FieldOptions();
            options1.setId(template.getId()+"");
            if("email".equals(template.getTemplateType())){
                options1.setName(template.getTemplateUsage());
            }else{
                options1.setName(template.getFileName());
            }

            options.add(options1);
        }
        return options;
    }

    @Override
    public List<FieldOptions> getCronInfo(String dataKey, String businessKey) {
        List<FieldOptions> options = new ArrayList<>();
        if("ConShippingAgency".equals(dataKey)){ // 船舶代理合同
            List<Map<String,Object>> list = spFobTemplateMapper.selectCronInfo();
            for (Map<String, Object> map:list){
                FieldOptions options1 = new FieldOptions();
                options1.setId(map.get("id").toString());
                options1.setName(map.get("contract_name").toString());
                options.add(options1);
            }
        }else if("MACron".equals(dataKey)){
            List<Map<String,Object>> list = spFobTemplateMapper.selectMACronInfo();
            for (Map<String, Object> map:list){
                FieldOptions options1 = new FieldOptions();
                options1.setId(map.get("id").toString());
                options1.setName(map.get("contract_name").toString());
                options.add(options1);
            }
        } else if("ConThirdPartyMeasurement".equals(dataKey)){
            List<Map<String,Object>> list = spFobTemplateMapper.selectConThirdPartyMeasurementInfo();
            for (Map<String, Object> map:list){
                FieldOptions options1 = new FieldOptions();
                options1.setId(map.get("id").toString());
                options1.setName(map.get("contract_name").toString());
                options.add(options1);
            }
        }else if("ConInsurancePeople".equals(dataKey)){//租船人责任险
            List<Map<String,Object>> list = spFobTemplateMapper.selectConInsurancePeople();
            for (Map<String, Object> map:list){
                FieldOptions options1 = new FieldOptions();
                options1.setId(map.get("id").toString());
                options1.setName(map.get("contract_name").toString());
                options.add(options1);
            }
        }else if("ConInsuranceGoods".equals(dataKey)){ //货险
            List<Map<String,Object>> list = spFobTemplateMapper.selectConInsuranceGoods();
            for (Map<String, Object> map:list){
                FieldOptions options1 = new FieldOptions();
                options1.setId(map.get("id").toString());
                options1.setName(map.get("contract_name").toString());
                options.add(options1);
            }
        }
        return options;
    }

    /**
     * 新增邮件模板
     * @param fobTemplateBO 邮件模板对象
     * @return
     */
    @Override
    public JsonResult saveSpFobTemplate(SpFobTemplateBO fobTemplateBO, List<FormTemplate> formTemplates) {
        // 生成一个 UUID 作为批次 ID
        String uuid = UUID.randomUUID().toString();
        Optional<FormTemplate> targetItem = formTemplates.stream().filter(s->s.getId().equals(fobTemplateBO.getTemplateKey())).findFirst();
        //获取目标节点
        FormTemplate target = targetItem.get();
        // 如果 formTemplates 不为空且包含元素
        boolean flag = true;
        if (null != formTemplates && formTemplates.size() > 0) {
            for (FormTemplate f : formTemplates) {
                String flowId = f.getId().split("-")[0];
                // 过滤出与 目标节点名称一致的节点
                if (f.getName().equals(target.getName()) && StringUtils.isNotBlank(flowId) && fobTemplateBO.getTemplateFlowId().contains(flowId)) {
                    flag = false;
                    // 获取流程 ID，假设流程 ID 在 FormTemplate 的 ID 字段中，以 "-" 分隔
                    List<SpFobTemplate> items = spFobTemplateMapper.selectList(new LambdaQueryWrapper<SpFobTemplate>().eq(SpFobTemplate::getTemplateName,fobTemplateBO.getFileName()).eq(SpFobTemplate::getTemplateKey,f.getId()).eq(SpFobTemplate::getTemplateType,fobTemplateBO.getTemplateType()));
                    if(items.size()>0){
                        return JsonResult.failed("选择流程应用节点已存在当前名称模版，请修改后重新提交！");
                    }
                    // 创建一个 SpFobTemplate 对象，并复制属性值
                    SpFobTemplate fobTemplate = new SpFobTemplate();
                    BeanUtils.copyProperties(fobTemplateBO, fobTemplate);
                    // 设置模板的关键字
                    fobTemplate.setTemplateKey(f.getId());
                    // 将模板流程 ID 列表转换为逗号分隔的字符串，并设置到 fobTemplate 对象中
                    String flowIdStr = fobTemplateBO.getTemplateFlowId().stream().collect(Collectors.joining(","));
                    fobTemplate.setTemplateFlowId(flowIdStr);
                    // 设置批次 ID
                    fobTemplate.setBacthId(uuid);
                    fobTemplate.setTemplateName(fobTemplateBO.getTemplateName());
                    fobTemplate.setTemplateType(fobTemplateBO.getTemplateType());
                    fobTemplate.setTemplateStatus(1);
                    fobTemplate.setFileName(fobTemplateBO.getFileName());
                    fobTemplate.setCreateBy(SecurityUtils.getUsername());
                    fobTemplate.setTemplateUsage(fobTemplateBO.getTemplateUsage());
                    // 调用保存方法保存 fobTemplate 对象
                    this.save(fobTemplate);

                    SpFobTemplateFlie spFobTemplateFlie = new SpFobTemplateFlie();
                    spFobTemplateFlie.setTemplateId(fobTemplate.getId());
                    spFobTemplateFlie.setUrl(fobTemplate.getContent());
                    spFobTemplateFlie.setCreateBy(SecurityUtils.getUsername());
                    spFobTemplateFlie.setCreateDate(fobTemplate.getCreateDate());
                    spFobTemplateFlie.setOperate("启动");
                    spFobTemplateFlie.setFileName(fobTemplateBO.getFileName());
                    spFobTemplateFlieServer.save(spFobTemplateFlie);

                }
            }
        } else {
            return JsonResult.failed("新增失败，formTemplates为空");
        }
        if(flag){
            return JsonResult.failed("选择应用流程不存在选择名称节点，请核对后重新提交！");
        }
        return JsonResult.success("");
    }

    public JsonResult saveSpFobTemplate2(SpFobTemplateBO fobTemplateBO, List<NodeVO> formTemplates) {
        // 生成一个 UUID 作为批次 ID
        String uuid = UUID.randomUUID().toString();
        Optional<NodeVO> targetItem = formTemplates.stream().filter(s->s.getId().equals(fobTemplateBO.getTemplateKey())).findFirst();
        //获取目标节点
        NodeVO target = targetItem.get();
        // 如果 formTemplates 不为空且包含元素
        boolean flag = true;
        if (null != formTemplates && formTemplates.size() > 0) {
            for (NodeVO f : formTemplates) {
                String flowId = f.getId().split("-")[0];
                // 过滤出与 目标节点名称一致的节点
                if (f.getName().equals(target.getName()) && StringUtils.isNotBlank(flowId) && fobTemplateBO.getTemplateFlowId().contains(flowId)) {
                    flag = false;
                    String name = "";
                    if("email".equals(fobTemplateBO.getTemplateType())){
                        name = fobTemplateBO.getTemplateUsage();
                    }else{
                        name =  fobTemplateBO.getFileName();
                    }
                    // 获取流程 ID，假设流程 ID 在 FormTemplate 的 ID 字段中，以 "-" 分隔
                    List<SpFobTemplate> items = spFobTemplateMapper.selectList(new LambdaQueryWrapper<SpFobTemplate>().eq(SpFobTemplate::getTemplateName,name).eq(SpFobTemplate::getTemplateKey,f.getId()).eq(SpFobTemplate::getTemplateType,fobTemplateBO.getTemplateType()));
                    if(items.size()>0){
                        return JsonResult.failed("选择流程应用节点已存在当前用途模版，请修改后重新提交！");
                    }
                    // 创建一个 SpFobTemplate 对象，并复制属性值
                    SpFobTemplate fobTemplate = new SpFobTemplate();
                    BeanUtils.copyProperties(fobTemplateBO, fobTemplate);
                    // 设置模板的关键字
                    fobTemplate.setTemplateKey(f.getId());
                    // 将模板流程 ID 列表转换为逗号分隔的字符串，并设置到 fobTemplate 对象中
                    String flowIdStr = fobTemplateBO.getTemplateFlowId().stream().collect(Collectors.joining(","));
                    fobTemplate.setTemplateFlowId(flowIdStr);
                    // 设置批次 ID
                    fobTemplate.setBacthId(uuid);
                    fobTemplate.setTemplateName(fobTemplateBO.getTemplateName());
                    fobTemplate.setTemplateType(fobTemplateBO.getTemplateType());
                    fobTemplate.setTemplateStatus(1);
                    fobTemplate.setFileName(fobTemplateBO.getFileName());
                    fobTemplate.setCreateBy(SecurityUtils.getUsername());
                    fobTemplate.setTemplateUsage(fobTemplateBO.getTemplateUsage());
                    // 调用保存方法保存 fobTemplate 对象
                    this.save(fobTemplate);

                    SpFobTemplateFlie spFobTemplateFlie = new SpFobTemplateFlie();
                    spFobTemplateFlie.setTemplateId(fobTemplate.getId());
                    spFobTemplateFlie.setUrl(fobTemplate.getContent());
                    spFobTemplateFlie.setCreateBy(SecurityUtils.getUsername());
                    spFobTemplateFlie.setCreateDate(fobTemplate.getCreateDate());
                    spFobTemplateFlie.setOperate("启动");
                    spFobTemplateFlie.setFileName(fobTemplateBO.getFileName());
                    spFobTemplateFlieServer.save(spFobTemplateFlie);

                }
            }
        } else {
            return JsonResult.failed("新增失败，formTemplates为空");
        }
        if(flag){
            return JsonResult.failed("选择应用流程不存在选择名称节点，请核对后重新提交！");
        }
        return JsonResult.success("");
    }

    /**
     * 邮件模板列表 分页
     * @param page
     * @param pageDto
     * @return
     */
    @Override
    public JsonResult<Page<SpFobTemplateListVO>> getPage(Page page, SpFobTemplateDto pageDto) {
        Page<SpFobTemplateListVO> resultPage = this.baseMapper.getPage(page,pageDto);
        return JsonResult.success(resultPage);
    }

    @Override
    public JsonResult<Page<SpFobTemplateListVO>> getFilePage(Page page, SpFobFileTemplateDto pageDto) {
        Page<SpFobTemplateListVO> resultPage = this.baseMapper.getFilePage(page,pageDto);
        for (SpFobTemplateListVO vo : resultPage.getRecords()) {
            String templateKey = vo.getTemplateKey();
            if (templateKey.contains("FOB004")) {
                vo.setTemplateFlowName("004-DES反装销售");
            } else if (templateKey.contains("FOB001")) {
                vo.setTemplateFlowName("001-FOB采购-回国");
            } else if (templateKey.contains("FOB002")) {
                vo.setTemplateFlowName("002-FOB采购-FOB销售");
            } else if (templateKey.contains("FOB003")) {
                vo.setTemplateFlowName("003-FOB反装销售");
            } else if (templateKey.contains("FOB005")) {
                vo.setTemplateFlowName("005-内部转租");
            }else if (templateKey.contains("FOB006")) {
                vo.setTemplateFlowName("006-租入短期船");
            }else if (templateKey.contains("FOB007")) {
                vo.setTemplateFlowName("007-船舶租出");
            }else if (templateKey.contains("FOB008")) {
                vo.setTemplateFlowName("008-长期船");
            }
        }
        return JsonResult.success(resultPage);
    }

    /**
     * 查询邮件模板详情
     * @param id
     * @return
     */
    @Override
    public SpFobTemplateListVO getFobTemplateInfo(Long id){
        SpFobTemplateListVO fobTemplateListVO = new SpFobTemplateListVO();
        SpFobTemplate fobTemplate = this.getById(id);
        if(null != fobTemplate){
            BeanUtils.copyProperties(fobTemplate,fobTemplateListVO);
        }
        return fobTemplateListVO;
    }

    /**
     * 删除邮件模板
     * @param id
     */
    @Override
    public void removeFobTemplateById(Long id){
        SpFobTemplate fobTemplate = this.getById(id);
        if(null != fobTemplate){
            this.baseMapper.deleteById(id);
        }
    }

    /**
     * 邮件模板状态变更(也是修改方法)
     * @param fobTemplateUpdateDto
     * @return
     */
    @Override
    public SpFobTemplate updateFobTemplateStatus(SpFobTemplateUpdateDto fobTemplateUpdateDto, List<FormTemplate> formTemplates){
        SpFobTemplate fobTemplate = this.getById(fobTemplateUpdateDto.getId());
        Optional<FormTemplate> targetItem = formTemplates.stream().filter(s->s.getId().equals(fobTemplateUpdateDto.getTemplateKey())).findFirst();
        //获取目标节点
        FormTemplate target = targetItem.get();
        SpFobTemplate historyTemplate = this.getById(fobTemplateUpdateDto.getId());
        if(null != formTemplates && formTemplates.size()>0){
            // 获取目标节点一致节点
            formTemplates.stream().filter(f->f.getName().equals(target.getName())).forEach(f->{
                String flowId = f.getId().split("-")[0];
                if(StringUtils.isNotBlank(flowId) && fobTemplateUpdateDto.getTemplateFlowId().contains(flowId)){

                    List<SpFobTemplate> fobTemplates = this.list(new LambdaQueryWrapper<SpFobTemplate>()
                            .eq(SpFobTemplate::getTemplateName,historyTemplate.getTemplateName())
                            .eq(SpFobTemplate::getTemplateKey,f.getId())
                            .eq(SpFobTemplate::getTemplateType,historyTemplate.getTemplateType())
                    );
                    if(null != fobTemplates && fobTemplates.size()>0){
                        SpFobTemplate t =  fobTemplates.get(0);
                        SpFobTemplate spFobTemplate = new SpFobTemplate();
                        BeanUtils.copyProperties(fobTemplateUpdateDto,spFobTemplate);
                        spFobTemplate.setId(t.getId());
                        spFobTemplate.setTemplateKey(t.getTemplateKey());
                        spFobTemplate.setContent(fobTemplateUpdateDto.getContent());
                        String flowIdStr = fobTemplateUpdateDto.getTemplateFlowId().stream().collect(Collectors.joining(","));
                        spFobTemplate.setTemplateFlowId(flowIdStr);
                        this.updateById(spFobTemplate);
                    }else {
                        SpFobTemplate spFobTemplate = new SpFobTemplate();
                        BeanUtils.copyProperties(fobTemplateUpdateDto,spFobTemplate);
                        //spFobTemplate.setId(t.getId());
                        spFobTemplate.setTemplateKey(f.getId());
                        String flowIdStr = fobTemplateUpdateDto.getTemplateFlowId().stream().collect(Collectors.joining(","));
                        spFobTemplate.setTemplateFlowId(flowIdStr);
                        spFobTemplate.setId(null);
                        spFobTemplate.setTemplateType("email");
                        this.save(spFobTemplate);
                    }

                }
            });
        }
        if(null != fobTemplate){
            BeanUtils.copyProperties(fobTemplateUpdateDto,fobTemplate);
        }
        return fobTemplate;
    }

    public SpFobTemplate updateFobTemplateStatus2(SpFobTemplateUpdateDto fobTemplateUpdateDto, List<NodeVO> formTemplates){
        SpFobTemplate fobTemplate = this.getById(fobTemplateUpdateDto.getId());
        Optional<NodeVO> targetItem = formTemplates.stream().filter(s->s.getId().equals(fobTemplateUpdateDto.getTemplateKey())).findFirst();
        //获取目标节点
        NodeVO target = targetItem.get();
        SpFobTemplate historyTemplate = this.getById(fobTemplateUpdateDto.getId());
        if(null != formTemplates && formTemplates.size()>0){
            // 获取目标节点一致节点
            formTemplates.stream().filter(f->f.getName().equals(target.getName())).forEach(f->{
                String flowId = f.getId().split("-")[0];
                if(StringUtils.isNotBlank(flowId) && fobTemplateUpdateDto.getTemplateFlowId().contains(flowId)){

                    List<SpFobTemplate> fobTemplates = this.list(new LambdaQueryWrapper<SpFobTemplate>()
                            .eq(SpFobTemplate::getTemplateUsage,fobTemplateUpdateDto.getTemplateUsage())
                            .eq(SpFobTemplate::getTemplateKey,f.getId())
                            .eq(SpFobTemplate::getTemplateType,"email")
                    );
                    if(null != fobTemplates && fobTemplates.size()>0){
                        SpFobTemplate t =  fobTemplates.get(0);
                        SpFobTemplate spFobTemplate = new SpFobTemplate();
                        BeanUtils.copyProperties(fobTemplateUpdateDto,spFobTemplate);
                        spFobTemplate.setId(t.getId());
                        spFobTemplate.setTemplateKey(t.getTemplateKey());
                        spFobTemplate.setContent(fobTemplateUpdateDto.getContent());
                        String flowIdStr = fobTemplateUpdateDto.getTemplateFlowId().stream().collect(Collectors.joining(","));
                        spFobTemplate.setTemplateFlowId(flowIdStr);
                        this.updateById(spFobTemplate);
                    }else {
                        SpFobTemplate spFobTemplate = new SpFobTemplate();
                        BeanUtils.copyProperties(fobTemplateUpdateDto,spFobTemplate);
                        //spFobTemplate.setId(t.getId());
                        spFobTemplate.setTemplateName(f.getName());
                        spFobTemplate.setTemplateKey(f.getId());
                        String flowIdStr = fobTemplateUpdateDto.getTemplateFlowId().stream().collect(Collectors.joining(","));
                        spFobTemplate.setTemplateFlowId(flowIdStr);
                        spFobTemplate.setId(null);
                        spFobTemplate.setTemplateType("email");
                        this.save(spFobTemplate);
                    }
                }
            });
        }
        if(null != fobTemplate){
            BeanUtils.copyProperties(fobTemplateUpdateDto,fobTemplate);
        }
        return fobTemplate;
    }

    @Override
    public String processFile(FilePart file) {
        try {
            byte[] fileContent = file.content().blockFirst().asByteBuffer().array();

            ByteArrayInputStream inputStream = new ByteArrayInputStream(fileContent);

            XWPFDocument document = new XWPFDocument(inputStream);
            XWPFWordExtractor extractor = new XWPFWordExtractor(document);
            String text = extractor.getText();
            inputStream.close();

            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("Hyperlinks");

            String[] paragraphs = text.split("\\r?\\n");
            for (int i = 0; i < paragraphs.length; i++) {
                Row row = sheet.createRow(i);
                Cell cell = row.createCell(0);
                cell.setCellValue(paragraphs[i]);
            }

            String fileName = UUID.randomUUID().toString() + ".xlsx";
            FileOutputStream fileOutputStream = new FileOutputStream(fileName);
            workbook.write(fileOutputStream);
            fileOutputStream.close();

            return fileName;
        } catch (IOException e) {
            e.printStackTrace();
            return "失败";
        }
    }


    @Override
    public CompletableFuture<String> processFileAsync(FilePart file) {
        return CompletableFuture.supplyAsync(() -> processFile(file));
    }

    @Override
    public String getFileContent(String uri) throws IOException {
        StringBuilder content = new StringBuilder();

        // 打开连接
        URL url = new URL(uri);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        // 获取输入流
        try (InputStream inputStream = connection.getInputStream()) {
            // 使用 Apache POI 读取 Word 文档内容
            XWPFDocument document = new XWPFDocument(inputStream);
            for (XWPFParagraph paragraph : document.getParagraphs()) {
                content.append(paragraph.getText());
                content.append("\n");
            }
        } finally {
            // 关闭连接
            connection.disconnect();
        }

        return content.toString();
    }

    @Override
    public String getExportInfo(SpFobFileTemplateDto pageDto) throws IOException{
        List<SpFobFileTemplateListVO> resultList = this.baseMapper.getExportInfo(pageDto, pageDto.getIds());
        if (CollectionUtil.isNotEmpty(resultList)){
            resultList.forEach(item -> {
                String templateKey = item.getTemplateKey();
                if (templateKey.contains("FOB004")) {
                    item.setTemplateFlowName("004-DES反装销售");
                } else if (templateKey.contains("FOB001")) {
                    item.setTemplateFlowName("001-FOB采购-回国");
                } else if (templateKey.contains("FOB002")) {
                    item.setTemplateFlowName("002-FOB采购-FOB销售");
                } else if (templateKey.contains("FOB003")) {
                    item.setTemplateFlowName("003-FOB反装销售");
                } else if (templateKey.contains("FOB005")) {
                    item.setTemplateFlowName("005-内部转租");
                }else if (templateKey.contains("FOB006")) {
                    item.setTemplateFlowName("006-租入短期船");
                }else if (templateKey.contains("FOB007")) {
                    item.setTemplateFlowName("007-船舶租出");
                }else if (templateKey.contains("FOB008")) {
                    item.setTemplateFlowName("008-长期船");
                }
            });
        }
        return exportToExcel(resultList);
    }

    @Override
    public JsonResult updateFobFlieTemplateStatus(Long id) {
        // 获取当前时间
        LocalDateTime currentTime = LocalDateTime.now();

        // 将 LocalDateTime 转换为 Date 类型
        Date currentDate = java.sql.Timestamp.valueOf(currentTime);
        SpFobTemplate spFobTemplate = super.getById(id);;

        SpFobTemplateFlie spFobTemplateFlie = new SpFobTemplateFlie();
        spFobTemplateFlie.setTemplateId(id);
        spFobTemplateFlie.setUrl(spFobTemplate.getContent());
        spFobTemplateFlie.setCreateBy(SecurityUtils.getUsername());
        spFobTemplateFlie.setCreateDate(currentDate);


        if (spFobTemplate.getTemplateStatus() == 2){
            spFobTemplate.setTemplateStatus(1);
            spFobTemplateFlie.setOperate("启动");
        }else if (spFobTemplate.getTemplateStatus() == 1){
            spFobTemplate.setTemplateStatus(2);
            spFobTemplateFlie.setOperate("禁用");
        }
        spFobTemplateFlieServer.save(spFobTemplateFlie);

        spFobTemplate.setCreateDate(currentDate);
        spFobTemplate.setCreateBy(SecurityUtils.getUsername());
        super.updateById(spFobTemplate);

        return JsonResult.success();
    }

    @Override
    public JsonResult getFobFlieTemplateInfo(Long id) {
        SpFobTemplate spFobTemplate = super.getById(id);
        String uri = spFobTemplate.getContent();

        String oldPart = "http://10.75.33.149:9300/statics";
        String newPart = "https://lngshipping.cgp.cnooc/api/file/statics";

        String newUrl = "";
        if (uri.contains("https://lngshipping.cgp.cnooc")) {
            newUrl = uri.replace(newPart, oldPart);
        }else {
            newUrl = uri;
        }
        String httpUri = newUrl;

        List<String> labels = null;
        try {
            // 加载 Word 文档内容到 XWPFDocument 对象
            URL url = new URL(httpUri);
            URLConnection httpsURLConnection =  url.openConnection();
            InputStream is = httpsURLConnection.getInputStream();
            XWPFDocument doc = new XWPFDocument(is);

            // 创建文本提取器
            XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
            // 提取文本内容
            String text = extractor.getText();
            // 关闭文档
            doc.close();

            labels = new ArrayList<>();
            // 解析文档中标签数据
            labels = TemplateParamUtils.templateLabel(text, labels);
        } catch (IOException e) {
            e.printStackTrace();
            // 处理异常情况...
        }

//        List<String> labels = new ArrayList<>();
        List<SpFobTemplateFlieVo> spFobTemplateFlie = spFobTemplateFlieMapper.getInfoById(id);

        List<Map<String, String>> modifiedList = new ArrayList<>();
        // 定义日期格式化对象，将时间戳转换为特定格式的日期字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        // 遍历原始列表，将对象转换为新的Map，并存储到新列表中
        for (SpFobTemplateFlieVo item : spFobTemplateFlie) {
            // 创建新Map对象，用于存储转换后的值
            Map<String, String> map = new HashMap<>();

            // 获取原始的日期对象
            String createDate = item.getCreateDate() != null ? sdf.format(item.getCreateDate()) : null;
            // 将转换后的日期字符串存储到Map中
            map.put("createDate", createDate);
            // 将原始的createBy存储到Map中
            map.put("createBy", item.getCreateBy());
            // 将原始的operate存储到Map中
            map.put("operate", item.getOperate());

            modifiedList.add(map); // 将新Map对象存储到新列表中
        }
        Map<String, Object> params = new HashMap<>();
        params.put("uri",uri);
        params.put("operate",modifiedList);
        params.put("labels",labels);
        return JsonResult.success(params);
    }


    public String exportToExcel(List<SpFobFileTemplateListVO> resultList) throws IOException {
        // 创建工作簿
        Workbook workbook = new XSSFWorkbook();
        // 创建工作表
        Sheet sheet = workbook.createSheet("文件模板导出");

        // 创建表头
        Row headerRow = sheet.createRow(0);
        String[] headers = {"文件名称", "模板应用节点", "模板应用流程", "操作人", "状态", "操作时间"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
        }

        // 将查询结果放入表格中
        for (int i = 0; i < resultList.size(); i++) {
            SpFobFileTemplateListVO item = resultList.get(i);
            Row row = sheet.createRow(i + 1); // 第一行已经被用作表头，从第二行开始

            // 设置单元格内容
            row.createCell(0).setCellValue(item.getFileName());
            row.createCell(1).setCellValue(item.getTemplateName());
            row.createCell(2).setCellValue(item.getTemplateFlowName());
            row.createCell(3).setCellValue(item.getCreateBy());
            row.createCell(4).setCellValue(item.getTemplateStatus() == 1 ? "启用" : "暂停");
            // 时间按照年月日时分秒输出
            Cell dateCell = row.createCell(5);
            dateCell.setCellValue(item.getCreateDate().toString()); // 这里需要根据日期格式进行转换

            // 格式化日期
            CellStyle dateStyle = workbook.createCellStyle();
            dateStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            dateCell.setCellValue(dateFormat.format(item.getCreateDate()));
        }

        // 获取当前日期
        LocalDateTime currentDate = LocalDateTime.now();
        // 格式化日期为指定格式（例如：年月日）
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd HH.mm");
        String formattedDate = currentDate.format(formatter);
        String filename = "文件模板-"+formattedDate+".xlsx";

        // 将工作簿写入文件
        FileOutputStream fileOut = new FileOutputStream(filename);
        workbook.write(fileOut);
        fileOut.close();

        // 关闭工作簿
        workbook.close();

        //文件地址
        File file = new File(filename);
//        //声明参数集合
//        HashMap<String, Object> paramMap = new HashMap<>();
//        //文件
//        paramMap.put("file", file);
//        //输出
//        paramMap.put("output","json");
//        //自定义路径
//        paramMap.put("path","image");
//        //场景
//        paramMap.put("scene","image");
//
//        paramMap.put("filename",filename);
        FileInputStream input = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "application/octet-stream", input);
        R<SysFile> result1 = remoteFileService.upload(multipartFile);
        if(result1.getCode() != R.SUCCESS){
            throw new BusException("文件服务器连接失败", BaseResultCode.GENERAL_ERROR);
        }
        String url = result1.getData().getHttpsUrl();
        //上传
//        String result= HttpUtil.post(fileServerHost+"/group1/upload", paramMap);
////        String result= HttpUtil.post("http://106.12.241.246:8083/group1/upload", paramMap);
//        // 使用Gson解析JSON
//        Gson gson = new Gson();
//        JsonObject jsonObject = gson.fromJson(result, JsonObject.class);
//        // 获取"url"字段的值
//        String url = jsonObject.get("url").getAsString();
        file.delete();
//        System.out.println(url);
        return url;
    }

}
